package net.fxug.hokuriku.chocolat.model
{
    import flash.errors.IllegalOperationError;

    import net.fxug.hokuriku.chocolat.events.VoteEvent;
    import net.fxug.hokuriku.chocolat.service.VoteManager;

    /**
     * 投票情報を表すクラス。
     * 内部にGoodEventとBadEventの投票状況を保持する。
     */
    [Bindable]
    public class VoteInfo
    {
        /** タイマーに影響を与える上限値 */
        public static const ADD_COUNT_MAX:int = 5;
        /** ユーザID */
        public var userId:String;
        /** GoodEventの実行回数 */
        public var goodCount:int;
        /** BadEventの実行回数 */
        public var badCount:int;

//        private var goodChangeWatcher:ChangeWatcher;
//        private var badChangeWatcher:ChangeWatcher;

        /**
         * コンストラクタ
         */
        public function VoteInfo(userId:String)
        {
            this.userId = userId;
            this.goodCount = 0;
            this.badCount = 0;

//            this.goodChangeWatcher = ChangeWatcher.watch(this, "goodCount", changeWatcherEventHandler, true);
//            this.badChangeWatcher = ChangeWatcher.watch(this, "badCount", changeWatcherEventHandler, true);

        }

//        private function changeWatcherEventHandler(changeEvent:PropertyChangeEvent):void
//        {
//            var val:int = changeEvent.newValue as int;
//            trace(String(this.userId) + "::" + changeEvent.property + " is " + changeEvent.oldValue + " > " + changeEvent.newValue);
//
//            if (val > VoteInfo.ADD_COUNT_MAX)
//            {
//                trace("MAX COUNT VALUE>>>>");
//                var event:VoteStatusEvent = new VoteStatusEvent(VoteStatusEvent.MAX_VOTE_EVENT, this);
//                this.goodChangeWatcher.unwatch();
//                this.dispatchEvent(event);
//            }
//        }

        /**
         * カウントアップし上限をチェックする。
         * @param key VoteEvent.GOOD_EVENT or VoteEvent.BAD_EVENT
         * @return カウントアップした際に上限を超えていた場合にtrueを返す。
         */
        public function addAndCheck(key:String):Boolean
        {
            var ret:Boolean = false;
            if (key == VoteEvent.GOOD_EVENT)
            {
                if (this.goodCount >= ADD_COUNT_MAX)
                {
                    ret = true;
                }
                this.goodCount++;
            }
            else if (key == VoteEvent.BAD_EVENT)
            {
                if (this.badCount >= ADD_COUNT_MAX)
                {
                    ret = true;
                }
                this.badCount++;
            }
            return ret;
        }

//        /**
//         * 実行可能な場合にtrueを返す
//         * @param VoteEvent.type
//         */
//        public function isExecute(type:String):Boolean
//        {
//            if (type == null)
//            {
//                throw new ArgumentError("値が設定されていません。");
//            }
//            if (type == VoteEvent.GOOD_EVENT)
//            {
//                trace(type + "::" + this.goodCount);
//                return this.goodCount <= ADD_COUNT_MAX;
//            }
//            else if (type == VoteEvent.BAD_EVENT)
//            {
//                trace(type + "::" + this.badCount);
//                return this.badCount <= ADD_COUNT_MAX;
//            }
//
//            throw new IllegalOperationError("適切ではない値::" + type + "::が渡されました");
//        }

        public function toString():String
        {
            return "userId::" + this.userId + ",goodCount::" + this.goodCount + ",badCount::" + this.badCount;
        }
    }
}